# -*- coding:utf-8  -*-
# @Author: ChenYangMing
# @Time: 2024-08-30

import time
from datetime import datetime, timedelta


def current_timestamp():
    """
    返回当前的时间戳（秒）。
    :return: float, 当前时间的时间戳，以秒为单位。
    """
    return time.time()


def current_datetime():
    """
    返回当前的日期和时间。
    :return: datetime, 当前的日期和时间。
    """
    return datetime.now()


def current_formatted_time(
        fmt="%Y%m%d%H%M%S",
):
    """
    返回格式化后的当前时间字符串。
    :param fmt: str, 时间格式字符串，默认为 "%Y%m%d%H%M%S"。
                支持的格式化选项包括：
                - %Y : 四位数的年份
                - %m : 两位数的月份
                - %d : 两位数的日期
                - %H : 两位数的小时（24小时制）
                - %M : 两位数的分钟
                - %S : 两位数的秒
    :return: str, 格式化后的当前时间字符串。
    """
    now = datetime.now()
    formatted_time = now.strftime(fmt)
    return formatted_time


def generate_timestamps(
        start_time: str,
        end_time: str,
        time_unit: int,
):
    """
    生成指定时间范围内，以time_unit分钟为粒度的时间戳列表。
    :param start_time: str，开始时间。
    :param end_time: str，结束时间。
    :param time_unit: str，时间粒度，单位是分钟。
    :return: list，时间戳列表。
    """
    start_timestamp = datetime.strptime(f'{start_time}', '%Y/%m/%d %H:%M:%S')
    end_timestamp = datetime.strptime(f'{end_time}', '%Y/%m/%d %H:%M:%S')
    timestamps = []
    current_time = start_timestamp
    while current_time <= end_timestamp:
        timestamps.append(current_time.strftime('%Y/%m/%d %H:%M:%S'))
        current_time += timedelta(minutes=time_unit)
    return timestamps


def timeit(
        func,
):
    """
    装饰器：测量并打印函数执行所需的时间。
    :param func: callable, 要测量执行时间的函数。
    :return: callable, 包装后的函数，执行后打印所需时间。
    """

    def wrapper(
            *args,
            **kwargs,
    ):
        """
        包装函数，用于测量并打印被装饰函数的执行时间。
        :param args: 传递给原函数的参数。
        :param kwargs: 传递给原函数的关键字参数。
        :return: 原函数的返回值。
        """
        start_time = current_timestamp()
        result = func(*args, **kwargs)
        end_time = current_timestamp()
        elapsed_time = end_time - start_time
        print(f"{func.__name__} 执行时间为 {elapsed_time:.2f} 秒")
        return result

    return wrapper


# 示例使用
# # from time_utils import timeit
# @timeit
# def some_function_to_decorate(x):
#     time.sleep(x)  # 模拟耗时操作，例如睡眠
#     return x * x
#
#
# result = some_function_to_decorate(2)  # 调用装饰的函数
# print(f"Result of decorated function: {result}")
# # 获取当前时间戳和日期时间
# timestamp = current_timestamp()
# current_date_time = current_datetime()
# print(f"Current Timestamp: {timestamp}")
# print(f"Current Date & Time: {current_date_time}")
